#ifndef MYOS_GLOBAL_H
#define MYOS_GLOBAL_H

#include <myOs/types.h>

#define GDT_SIZE 128

// 全局描述符
typedef struct descriptor_t
{
    unsigned short limit_low;       // 段界限 0 ~ 15 位
    unsigned int base_low : 24;          // 基地址 0 ~ 23 位 16M
    unsigned char type : 4;         // 段类型
    unsigned char segment : 1;      // 1 表示代码段或数据段， 0 表示系统段
    unsigned char DPL : 2;          // Descriptor Privilege Level 描述符特权等级 0 ~ 3
    unsigned char present : 1;      // 存在位， 1 在内存中， 0 在磁盘上
    unsigned char limit_high : 4;   // 段界限 16 ~ 19
    unsigned char available : 1;    // 是否可用
    unsigned char long_mode : 1;    // 64 位拓展标志
    unsigned char big : 1;          // 32 位还是 16 位
    unsigned char granularity : 1;  // 粒度 4KB 还是 1B 
    unsigned char base_high;        // 基地址 24 ~ 31 位
} _packed descriptor_t;

// 段选择子
typedef struct selector_t
{
    u8 RPL : 2;
    u8 TI : 1;
    u16 index : 13;
} selector_t;

// 全局描述符表指针
typedef struct pointer_t
{
    u16 limit;  // 界限
    u32 base;   // 基地址
} _packed pointer_t;

void gdt_init();

#endif